home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
data
/
happysrc
/
picallsp.c
< prev
next >
Wrap
Text File
|
1993-11-30
|
26KB
|
848 lines
/**********************************************************************
*
* *** HAPPy P-code Interpriter ***
*
* Standard procedure , function の処理
*
* void callsp(void)
* void T_get(int fileno, _store *filebuf, FILE *fp,char *name)
*
* Copyright (c) H.Asano 1992.
**********************************************************************/
#define EXTERN extern
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "hapai.h"
extern void prerr(int,char*) ;
/********* P-CODE COMPUTER store **********/
extern _store store[] ;
/********* P-CODE COMPUTER registers **********/
extern int q ; /* q */
extern _store *sp ; /* sp points to top of the stack */
extern int pc ; /* program counter */
extern int mp ; /* mp points to begginning of a data segment */
extern int ep ; /* ep points to the maxmum extent of the stack */
extern int np ; /* np points to top of the dynamically allocated area */
extern boolean readlnflag ; /* inputにreadlnをした時 及び
起動時には真 */
/**************************************************/
/* searchfile() : fileadrに対応するファイルを探す *
/**************************************************/
static fileinfo *searchfile(int fileadr)
{
int i = -1 ;
while(fi[++i].fileadr != fileadr) ;
return(fi+i) ;
}
/**************************************************/
/* fileerrmsg() : file関係のエラーメッセージ出力 */
/**************************************************/
static void fileerrmsg(int msgno,char *pname,fileinfo *fiadr,char *msg)
{
char *fname, *rfname;
char buf[160] ;
fname = (*fiadr).filename ;
rfname = (*fiadr).rfname ;
sprintf(buf,"%s: %s(実ファイル=%s)%s", pname,fname,rfname,msg) ;
prerr(msgno,buf) ;
}
/******************************************/
/* checkgeneration() : 生成モードチェック */
/******************************************/
static void checkgeneration(char *pname,fileinfo *fiadr)
{
if((*fiadr).mode != generation)
fileerrmsg(9,pname,fiadr,"が生成モードでない") ;
}
/******************************************/
/* checkinspection() : 検査モードチェック */
/******************************************/
static void checkinspection(char *pname,fileinfo *fiadr)
{
if((*fiadr).mode != inspection)
fileerrmsg(14,pname,fiadr,"が検査モードでない") ;
}
/*************************************************/
/* err131() : ファイル書き込み障害メッセージ出力 */
/*************************************************/
static void err131(char *pname,fileinfo *fiadr)
{
fileerrmsg(131,pname,fiadr,"で障害が発生した") ;
}
/*****************************************/
/* T_get() : textファイルからの1文字読込 */
/*****************************************/
void T_get(fileinfo *fiadr, _store *filebuf, FILE *fp,char *name)
{
if(feof((*fiadr).fp))
fileerrmsg(42,name,fiadr,"がEOFとなっている") ;
(*filebuf).vc = getc(fp) ; /* 1文字先読み */
if(ferror(fp))
fileerrmsg(181,name,fiadr,"で障害が発生した") ;
(*fiadr).eolnflag = (*filebuf).vc == '\n' ;
/* 改行を読んだ時 真 */
if((*fiadr).eolnflag) (*filebuf).vc = ' ' ;
}
/******************* 各P-codeの処理 ***********************************/
/**************************************/
/* ATN() : arctan標準関数 */
/**************************************/
static void ATN(void)
{
(*sp).vr = (float)atan((double)(*sp).vr);
}
/**************************************/
/* COS() : cos標準関数 */
/**************************************/
static void COS(void)
{
(*sp).vr = (float)cos((double)(*sp).vr) ;
}
/**************************************/
/* DIS() : dispose標準手続き */
/**************************************/
static void DIS(void)
{
int ad ;
ad = (*(sp-1)).va ; /* 解放するアドレス */
if(ad == NilValue)
prerr(23,"dispose: 引数の値がnilである") ;
if((np <= ad) && (ad < Maxstore)) { /* 正常値 */
if(ad == np) np += (short)(*sp).vi ; /* 一番後にnewした時だけ*/
/* 本当に解放する */
}
else prerr(24,"dispose: 引数の値が不定である") ;
sp-=2 ;
}
/***************************************/
/* EOL() : eol標準関数 */
/***************************************/
static void EOL(void)
{
fileinfo *fiadr ;
fiadr = searchfile((*sp).va) ;
if((*fiadr).mode == undefined)
fileerrmsg(41,"eoln",fiadr,"が不定である") ;
if(feof((*fiadr).fp))
fileerrmsg(42,"eoln",fiadr,"がEOFとなっている") ;
if((fiadr==fi) && readlnflag) { /* inputファイルで直前がreadln*/
T_get(fiadr,store+(*sp).va,(*fiadr).fp,"eoln") ;
/* 次の文字を読込 */
readlnflag = false ;
}
(*sp).vb = (*fiadr).eolnflag ;
}
/***************************************/
/* EoF() : eof標準関数 */
/***************************************/
static void EoF(void)
{
int fileadr ;
fileinfo *fiadr ;
fileadr = (*sp).va ;
fiadr = searchfile(fileadr) ;
if((fiadr==fi) && readlnflag) { /* inputファイルで直前がreadln*/
T_get(fiadr,store+fileadr,(*fiadr).fp,"eof") ;
/* 次の文字を読込 */
readlnflag = false ;
(*sp).vb = feof((*fiadr).fp) ;
}
else { /* 通常のeof */
if((*fiadr).mode == undefined)
fileerrmsg(40,"eof",fiadr,"が不定である") ;
(*sp).vb = ((*fiadr).mode == generation) /* 生成モードは真*/
? true : feof((*fiadr).fp) ;
}
}
/**************************************/
/* EXP() : exp標準関数 */
/**************************************/
static void EXP(void)
{
(*sp).vr = (float)exp((double)(*sp).vr) ;
}
/**************************************/
/* GET() : テキストファイル以外のget */
/**************************************/
static void GET(void)
{
int fileadr ;
fileinfo *fiadr ;
FILE *fp ;
fileadr = (*sp--).va ;
fiadr = searchfile(fileadr) ;
fp = (*fiadr).fp ;
checkinspection("get",fiadr) ;
if(feof(fp))
fileerrmsg(16,"get",fiadr,"がEOFとなっている") ;
fread(store+fileadr, (*fiadr).filesize*sizeof(_store),1,fp);
if(ferror(fp)) err131("get",fiadr) ;
}
/**************************************/
/* LOG() : ln標準関数 */
/**************************************/
static void LOG(void)
{
if((*sp).vr <= (float)0.0)
prerr(33,"ln: 引数の値が0以下である") ;
(*sp).vr = (float)log((double)(*sp).vr);
}
/**************************************/
/* NEW() : new標準手続き */
/**************************************/
static void NEW(void)
{
int ad ;
ad = np-(short)(*sp).vi ;
if(ad <= ep)
prerr(121,"new: メモリ不足で割り付けができない") ;
np = ad ;
ad = (*(sp-1)).va ;
store[ad].va = np ;
sp-=2 ;
}
/**************************************/
/* PGE() : page標準手続き */
/**************************************/
static void PGE(void)
{
fileinfo *fiadr ;
fiadr = searchfile((*sp--).va) ;
checkgeneration("page",fiadr) ;
if(!(*fiadr).writelnflag) /* 最後が改行でない時 */
if(fputc('\n',(*fiadr).fp) == EOF) err131("page",fiadr) ;
if(fputc('\f',(*fiadr).fp) == EOF) err131("page",fiadr) ;
(*fiadr).writelnflag = false ;
}
/**************************************/
/* PUT() : テキストファイル以外のput */
/**************************************/
static void PUT(void)
{
int fileadr ;
fileinfo *fiadr ;
FILE *fp ;
fileadr = (*sp--).va ;
fiadr = searchfile(fileadr) ;
fp = (*fiadr).fp ;
checkgeneration("put",fiadr) ;
fwrite(store+fileadr, (*fiadr).filesize*sizeof(_store),1,fp) ;
if(ferror(fp))
fileerrmsg(182,"put",fiadr,"で障害が発生した") ;
}
/**************************************/
/* RLN() : テキストファイルのreadln */
/**************************************/
static void RLN(void)
{
FILE *fp ;
_store *filebuf ;
fileinfo *fiadr ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
filebuf = (*fiadr).filebuf ;
checkinspection("read",fiadr) ;
if((fiadr==fi) && readlnflag)
T_get(fiadr,filebuf,fp,"readln");
while(!(*fiadr).eolnflag)
T_get(fiadr,filebuf,fp,"readln"); /* 改行文字を読み飛ばす */
if(fiadr == fi) readlnflag = true ; /* inputファイルの時 */
else
T_get(fiadr,filebuf,fp,"readln") ; /* 次の文字を読込 */
sp-- ;
}
/*****************************************/
/* RDC() : テキストファイルからの文字読込*/
/*****************************************/
static void RDC(void)
{
FILE *fp ;
_store *filebuf ;
fileinfo *fiadr ;
short ad ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
filebuf = (*fiadr).filebuf ;
checkinspection("read",fiadr) ;
if(feof(fp))
fileerrmsg(16,"read",fiadr,"がEOFとなっている") ;
if((fiadr==fi) && readlnflag) { /* inputファイルで直前がreadln*/
T_get(fiadr,filebuf,fp,"read") ; /* 次の文字を読込 */
readlnflag = false ;
}
ad = (*(sp-1)).va ;
store[ad].vc = (*filebuf).vc ; /* バッファ変数から変数へ代入 */
T_get(fiadr,filebuf,fp,"read") ; /* 次の文字を読込 */
sp-=2 ;
}
/*****************************************/
/* RDI() : テキストファイルからの整数読込*/
/*****************************************/
static void RDI(void)
{
FILE *fp ;
_store *filebuf ;
fileinfo *fiadr ;
int ad ;
int lch ;
integer ival = 0 ;
int sign = 1 ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
filebuf = (*fiadr).filebuf ;
ad = (*(sp-1)).va;
checkinspection("read",fiadr) ;
if((fiadr==fi) && readlnflag) { /* inputファイルで直前がreadln*/
T_get(fiadr,filebuf,fp,"read") ; /* 次の文字を読込 */
readlnflag = false ;
}
while((*filebuf).vc == ' ') /* 空白読み飛ばし */
T_get(fiadr,filebuf,fp,"read");
if(((*filebuf).vc=='+') || ((*filebuf).vc=='-')) { /* 符号の時 */
sign = ((*filebuf).vc=='+') ? 1 : -1 ; /* 符号に応じた正負 */
T_get(fiadr,filebuf,fp,"read");
}
if(((*filebuf).vc >= '0') && ((*filebuf).vc <= '9')) { /* 数字 */
do {
lch = (*filebuf).vc - '0' ;
if(ival <= (Maxint-lch/10)) /* 上限チェック */
ival = ival*10 + lch ;
else
fileerrmsg(54,"read",fiadr,
"から符号付き整数の形式でないものを読もうとした") ;
T_get(fiadr,filebuf,fp,"read");
if(feof(fp)) break ; /* eofだったら終わり */
} while(('0' <= (*filebuf).vc ) && ((*filebuf).vc <= '9')) ;
store[ad].vi = sign * ival ;
}
else { /* 最初に数字がこなかった時 */
if(feof(fp)) fileerrmsg(16,"read",fiadr,"がEOFとなっている") ;
fileerrmsg(54,"read",fiadr,
"から符号付き整数の形式でないものを読もうとした") ;
}
sp-=2;
}
/*****************************************/
/* RDR() : テキストファイルからの実数読込*/
/*****************************************/
static void RDR(void)
{
FILE *fp ;
_store *filebuf ;
fileinfo *fiadr ;
char buf[80] ;
char *stopstring ;
int i ;
integer ival = 0 ; /* 整数部の値 */
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
filebuf = (*fiadr).filebuf ;
checkinspection("read",fiadr) ;
if((fiadr==fi) && readlnflag) { /* inputファイルで直前がreadln*/
T_get(fiadr,filebuf,fp,"read") ; /* 次の文字を読込 */
readlnflag = false ;
}
for(i=0;i<80;i++) *(buf+i) = '\0'; /* バッファクリア */
i = 0 ;
while((*filebuf).vc == ' ') /* 空白読み飛ばし */
T_get(fiadr,filebuf,fp,"read");
if(((*filebuf).vc=='+') || ((*filebuf).vc=='-')) { /* 符号の時 */
buf[i++] = (char)(*filebuf).vc ;
T_get(fiadr,filebuf,fp,"read");
}
if(((*filebuf).vc >= '0') && ((*filebuf).vc <= '9')) { /* 数字 */
do {
buf[i++] = (char)(*filebuf).vc ;
ival = ival*10 + (*filebuf).vc - '0';
T_get(fiadr,filebuf,fp,"read");
if(feof(fp)) break ; /* eofだったら終わり */
} while(('0' <= (*filebuf).vc ) && ((*filebuf).vc <= '9')) ;
if((*filebuf).vc == '.') { /* 小数点 */
buf[i++] = (char)(*filebuf).vc ;
T_get(fiadr,filebuf,fp,"read"); /* 小数点を読み飛ばす */
if(((*filebuf).vc >= '0') && ((*filebuf).vc <= '9')) { /* 数字 */
do {
buf[i++] = (char)(*filebuf).vc ;
T_get(fiadr,filebuf,fp,"read");
if(feof(fp)) break ; /* eofだったら終わり */
} while(('0' <= (*filebuf).vc ) && ((*filebuf).vc <= '9')) ;
}
else goto error ; /* . の次が数字でない時 */
}
if(((*filebuf).vc == 'e') || ((*filebuf).vc == 'E')) { /* 指数*/
buf[i++] = (char)(*filebuf).vc ;
T_get(fiadr,filebuf,fp,"read"); /* eまたはEを読み飛ばす */
if(((*filebuf).vc=='+') || ((*filebuf).vc=='-')) { /* 符号の時*/
buf[i++] = (char)(*filebuf).vc ;
T_get(fiadr,filebuf,fp,"read");
}
if(((*filebuf).vc >= '0') && ((*filebuf).vc <= '9')) { /* 数字*/
do {
buf[i++] = (char)(*filebuf).vc ;
T_get(fiadr,filebuf,fp,"read");
if(feof(fp)) break ; /* eofだったら終わり */
} while(('0' <= (*filebuf).vc ) && ((*filebuf).vc <= '9')) ;
}
else goto error ; /* 指数部の最初が数字でない */
}
}
else goto error ; /* 最初に数字がこなかった時 */
store[(*(sp-1)).va].vr = (float)strtod(buf,&stopstring) ;
sp -= 2;
return ;
error : /* 符号つき数字でない時 */
if(feof(fp)) fileerrmsg(16,"read",fiadr,"がEOFとなっている") ;
fileerrmsg(56,"read",fiadr,
"から符号付き数の形式でないものを読もうとした") ;
}
/****************************************/
/* RST() : テキストファイル以外のreset */
/****************************************/
static void RST(void)
{
int fileadr ;
fileinfo *fiadr ;
FILE *fp ;
fileadr = (*sp--).va ;
fiadr = searchfile(fileadr) ;
fclose((*fiadr).fp) ; /*まずクローズ(エラーでも良い)*/
fp = fopen((*fiadr).rfname,"rb") ;
if(fp == NULL)
fileerrmsg(13,"reset",fiadr,"が不定である") ;
(*fiadr).mode = inspection ; /* 検査モード */
(*fiadr).fp = fp ;
fread(store+fileadr, (*fiadr).filesize*sizeof(_store),1,fp) ;
/* 最初の要素をバッファ変数に */
}
/******************************************/
/* RWT() : テキストファイル以外のrewrite */
/******************************************/
static void RWT(void)
{
fileinfo *fiadr ;
fiadr = searchfile((*sp--).va) ;
fclose((*fiadr).fp) ; /*まずクローズ(エラーでも良い)*/
(*fiadr).fp = fopen((*fiadr).rfname,"wb") ;
if((*fiadr).fp == NULL)
fileerrmsg(132,"rewrite",fiadr,"のオープンができない") ;
(*fiadr).mode = generation ; /* 生成モード */
}
/***************************************/
/* SIN() : sin標準関数 */
/***************************************/
static void SIN(void)
{
(*sp).vr = (float)sin((double)(*sp).vr) ;
}
/***************************************/
/* SQT() : sqrt標準関数 */
/***************************************/
static void SQT(void)
{
if((*sp).vr < (float)0.0) /* 負の平方根 */
prerr(34,"sqrt:引数の値が負である") ;
(*sp).vr = (float)sqrt((double)(*sp).vr);
}
/***************************************/
/* TGT() : テキストファイルのget */
/***************************************/
static void TGT(void)
{
FILE *fp ;
_store *filebuf ;
fileinfo *fiadr ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
filebuf = (*fiadr).filebuf ;
checkinspection("get",fiadr) ;
if((fiadr==fi) && readlnflag) { /* inputファイルで直前がreadln*/
T_get(fiadr,filebuf,fp,"get") ; /* 次の文字を読込 */
readlnflag = false ;
}
if(feof(fp))
fileerrmsg(16,"get",fiadr,"がEOFとなっている") ;
T_get(fiadr,filebuf,fp,"get") ; /* 次の文字を読込 */
sp-- ;
}
/***************************************/
/* TPT() : テキストファイルへのput */
/***************************************/
static void TPT(void)
{
FILE *fp ;
fileinfo *fiadr ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
checkgeneration("put",fiadr) ;
if(fputc((*(store+(*sp--).va)).vc,fp) == EOF) /* 文字出力 */
err131("put",fiadr) ;
(*fiadr).writelnflag = false ;
}
/***************************************/
/* TRS() : テキストファイルへのreset */
/***************************************/
static void TRS(void)
{
FILE *fp ;
fileinfo *fiadr ;
_store *filebuf ;
fiadr = searchfile((*sp--).va) ;
filebuf = (*fiadr).filebuf ;
if((strcmp((*fiadr).filename,"input")==0) || /* inputファイル */
(strcmp((*fiadr).filename,"output")==0)) /* outputファイル */
fileerrmsg(81,"reset",fiadr,"に対してresetはできない") ;
if((*fiadr).mode == generation) /* 今が生成モードの時 */
if(! (*fiadr).writelnflag) /* 最後が改行マークでない時 */
if(fputc('\n',(*fiadr).fp) == EOF) /* 改行を書き込む */
err131("reset",fiadr) ;
fclose((*fiadr).fp) ; /* ファイルクローズ */
fp = fopen((*fiadr).rfname,"rt") ; /* テキストモードオープン */
if(fp == NULL)
fileerrmsg(13,"reset",fiadr,"が不定である") ;
(*fiadr).fp = fp ;
(*fiadr).mode = inspection ; /* 検査モード */
(*fiadr).textfile = true ; /* テキストファイル */
T_get(fiadr,filebuf,fp,"reset") ; /* 最初の文字を読む */
}
/***************************************/
/* TRW() : テキストファイルへのrewrite */
/***************************************/
static void TRW(void)
{
fileinfo *fiadr ;
fiadr = searchfile((*sp--).va) ;
if((strcmp((*fiadr).filename,"input")==0) || /* inputファイル */
(strcmp((*fiadr).filename,"output")==0)) /* outputファイル */
fileerrmsg(82,"rewrite",fiadr,"に対してrewriteはできない") ;
fclose((*fiadr).fp) ; /*まずクローズ(エラーでも良い)*/
(*fiadr).fp = fopen((*fiadr).rfname,"wt") ;
if((*fiadr).fp == NULL)
fileerrmsg(132,"rewrite",fiadr,"のオープンができない") ;
(*fiadr).mode = generation ; /* 生成モード */
(*fiadr).textfile = true ; /* テキストファイル */
(*fiadr).writelnflag = true; /* rewrite直後には改行いらない*/
}
/***************************************/
/* WLN() : writeln標準手続き */
/***************************************/
static void WLN(void)
{
fileinfo *fiadr ;
fiadr = searchfile((*sp--).va) ;
checkgeneration("writeln",fiadr) ;
if(fputc('\n',(*fiadr).fp) == EOF) err131("writeln",fiadr) ;
(*fiadr).writelnflag = true ;
}
/***************************************/
/* WRB() : boolean型の出力 */
/***************************************/
static void WRB(void)
{
fileinfo *fiadr ;
char *put ;
short i,j,k ;
FILE *fp ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
checkgeneration("write",fiadr) ;
put = ((*(sp-2)).vb) ? "TRUE" : "FALSE" ;
j = strlen(put) ; /* 出力文字長 */
k = (short)(*(sp-1)).vi ; /* 出力幅 */
if(k>j) /* 空白をつける必要のある時 */
for(i=1;i<=(k-j);i++)
if(fputc(' ',fp) == EOF) err131("write",fiadr) ;
else j= k ;
for(i=0;i<j;i++)
if(fputc((int)put[i], fp) == EOF) err131("write",fiadr) ;
(*fiadr).writelnflag = false ;
sp-=3;
}
/***************************************/
/* WRC() : テキストファイルに文字出力 */
/***************************************/
static void WRC(void)
{
fileinfo *fiadr ;
int i ;
FILE *fp ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
checkgeneration("write",fiadr) ;
for(i=1;i<(int)(*(sp-1)).vi;i++)
if(fputc(' ',fp) == EOF) err131("write",fiadr) ;
if(fputc((*(sp-2)).vc,fp) == EOF) err131("write",fiadr) ;
(*fiadr).writelnflag = false ;
sp-=3 ;
}
/***************************************/
/* WRF() : テキストファイルに実数出力 */
/***************************************/
static void WRF(void)
{
fileinfo *fiadr ;
FILE *fp ;
char buf1[80] ;
char buf2[80] ;
int width ;
int i ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
checkgeneration("write",fiadr) ;
*buf1 = '%' ; /* %1.xfという形を生成 */
sprintf(buf1+1,"1.%df",(int)(*(sp-1)).vi) ; /* 少数点以下の桁数*/
width = sprintf(buf2,buf1,(*(sp-3)).vr); /* 固定小数点変換 */
for(i=width;i<(int)(*(sp-2)).vi;i++)
if(fputc(' ',fp) == EOF) /* 前に空白を出力する */
err131("write",fiadr) ;
if(fputs(buf2,fp) != 0) err131("write",fiadr) ;
(*fiadr).writelnflag = false ;
sp-=4 ;
}
/***************************************/
/* WRI() : テキストファイルに整数出力 */
/***************************************/
static void WRI(void)
{
char buf[12];
fileinfo *fiadr ;
FILE *fp ;
short i,len ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
checkgeneration("write",fiadr) ;
len=sprintf(buf,"%ld",(*(sp-2)).vi); /* 数字出力に必要な桁 */
for(i=(short)(*(sp-1)).vi;i>len;i--)
if(fputc(' ',fp) == EOF) /* 数字の前に空白を出力する */
err131("write",fiadr) ;
if(fputs(buf,fp) != 0) err131("write",fiadr) ;
(*fiadr).writelnflag = false ;
sp -= 3 ;
}
/***************************************/
/* WRR() : テキストファイルに実数出力 */
/***************************************/
static void WRR(void)
{
char buf[15] ;
int keta ;
int width ;
int point ;
fileinfo *fiadr ;
FILE *fp ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
checkgeneration("write",fiadr) ;
keta = (int)(*(sp-1)).vi ; /* 出力桁 */
width = (keta >= 9) ? keta : 9 ; /* 必要出力桁 */
point = width - 8 ;
*buf = '%' ; /* %x.xEの形に変換 */
sprintf(buf+1,"%d.%dE",width,point);
fprintf(fp,buf,(*(sp-2)).vr) ;
(*fiadr).writelnflag = false ;
sp -= 3 ;
}
/***************************************/
/* WRS() : テキストファイルに文字列出力*/
/***************************************/
static void WRS(void)
{
fileinfo *fiadr ;
FILE *fp ;
short i,j,k ;
int ad ;
fiadr = searchfile((*sp).va) ;
fp = (*fiadr).fp ;
checkgeneration("write",fiadr) ;
ad= (*(sp-3)).va ;
k = (short)(*(sp-2)).vi ; /* k=出力幅 */
j = (short)(*(sp-1)).vi ; /* j=文字数 */
if(k>j) /* 空白をつける必要のある時 */
for(i=1;i<=(k-j);i++)
if(fputc(' ',fp) == EOF) err131("write",fiadr) ;
else j= k ;
for(i=0;i<j;i++)
if(fputc(store[ad+i].vc,fp) == EOF) err131("write",fiadr) ;
(*fiadr).writelnflag = false ;
sp-=4;
}
/**********************************************************************/
/* P-code 別 処理エントリ表 */
/**********************************************************************/
static struct entry {
void (*func)(void) ;
} pcd[] = {
/* xx0 xx1 xx2 xx3 xx4 xx5 xx6 xx7 xx8 xx9 */
/*00x*/ GET, PUT, RST, RLN, NEW, WLN, WRS, WRB, WRI, WRR,
/*01x*/ WRC, RDI, RDR, RDC, SIN, COS, EXP, LOG, SQT, ATN,
/*02x*/ PGE, EoF, EOL, DIS, WRF, RWT, TRS, TRW, TGT, TPT
};
/********* callsp() : csp 命令の実行 ***********/
void callsp(void)
{
pcd[q].func() ; /* opに対応した命令を実行 */
}